<?php

namespace App\Services\Oauth\Oauth2;

use Illuminate\Support\Facades\Redis;
use App\Services\Oauth\Oauth2\App;
use App\Services\Oauth\User;
use App\Exceptions\Response\Service\ServiceCode;
use App\Exceptions\Response\Service\ServiceException;

/**
 * oauth2的实现（授权码）
 * 处理客户端向认证服务器申请授权码code的业务(验证请求、返回code给客户端)
 */
class Login extends App
{

    protected $user;

    public function __construct($appKey = '')
    {
        parent::__construct();
        $this->user = new User();
        $this->init($appKey);
    }

    public function init($appKey = '')
    {
        if (!$appKey) {
            throw new ServiceException(ServiceCode::SERVICE_OAUTH_APP_KEY_NOT_EXIST, '', []);
        }
        $this->setAppKey($appKey);
        $this->getAppInfo();
    }

    /**
     * 客户端向认证服务器申请授权请求（code）， 检查请求参数是否正确
     * @param $params（app_key、response_type、redirect_uri、scope、state）5个
     * app_key：应用的key
     * response_type：表示授权类型，必选项，此处的值固定为"code"
     * redirect_uri：表示重定向URI，必选项，且必须与A步骤中的该参数值保持一致。
     * scope：表示申请的权限范围，可选项
     * state：表示客户端的当前状态，可以指定任意值，认证服务器会原封不动地返回这个值。
     * 表示申请的权限范围，可选项
     */
    public function checkParams($params)
    {
        foreach ($params as $key => $value) {
            switch ($key) {
                case 'response_type':
                    if ($value !== 'code') {
                        throw new ServiceException(ServiceCode::SERVICE_OAUTH_RESPONSE_TYPE_IS_NOT_SUPPORTED, '', []);
                    }
                    break;
                //重定向的url
                case 'redirect_uri':
                    if ($this->read('domain') !== $this->baseUrl($value)) {
                        throw new ServiceException(ServiceCode::SERVICE_OAUTH_REDIRECT_MISMATCH, '', []);
                    }
                    $this->code_data[$key] = $value;
                    break;
                //表示申请的权限范围，可选项
                case 'scope':
                    if (!in_array($value, $this->scope)) {
                        throw new ServiceException(ServiceCode::SERVICE_OAUTH_INVALID_SCOPE, '', []);
                    }
                    $this->code_data[$key] = $value;
                    break;
                default:
                    $this->code_data[$key] = $value;
                    break;
            }
        }
    }

    /**
     * 授权服务器回应客户端的URI，包含授权码（code）、state 2个参数
     * 页面跳转到客户的回调页面
     */
    public function callBack()
    {
        //获取用户的userid
        $this->code_data['userId'] = $this->user->getUserId();
        //获取url中的参数（arg=value&anchor=123&name=liuyang）
        $query = $this->parseUrl($this->code_data['redirect_uri'], PHP_URL_QUERY);
        $str = '?';
        if ($query) {
            $str = '&';
        }
        $redirect_uri = $this->code_data['redirect_uri'] . $str . 'code=' . $this->getCode() . '&state=' . $this->code_data['state'];
        // header('Location: ' . $redirect_uri);
        //页面跳转到客户的回调页面
        echo "<meta http-equiv=refresh content='0; url=$redirect_uri'>";
        exit();
    }

}